﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TheBullysStore.Models.ModuloAdministracion.Departamento;
using TheBullysStore.Models.ModuloAdministracion.Edificio;
using TheBullysStore.Models.ModuloAdministracion.Usuario;
using TheBullysStore.Models.ModuloAdministracion.DepartamentoPeru;
using TheBullysStore.Models.ModuloAdministracion.ProvinciaPeru;
using TheBullysStore.Models.ModuloAdministracion.DistritoPeru;
using TheBullysStore.Models.ModuloAdministracion.Cargo;
using TheBullysStore.Models.ModuloAdministracion.Seguro;
using TheBullysStore.Models.ModuloAdministracion.TipoDoc;
using TheBullysStore.Models;
using System.Json;
using log4net;


namespace TheBullysStore.Controllers.ModuloAdministracion.Usuario

{
    public class UsuarioController : Controller
    {
        private TheBullysStoreDB db = new TheBullysStoreDB();
        private static ILog log = LogManager.GetLogger(typeof(UsuarioController));
        UsuarioFacade usuarioFacade = new UsuarioFacade();
        CargoFacade cargoFacade = new CargoFacade();
        SeguroFacade seguroFacade = new SeguroFacade();
        TipoDocFacade tipodocFacade = new TipoDocFacade();
        DepartamentoPeruFacade departamentoPeruFacade = new DepartamentoPeruFacade();
        ProvinciaPeruFacade provinciaPeruFacade = new ProvinciaPeruFacade();
        DistritoPeruFacade distritoPeruFacade = new DistritoPeruFacade();
        DepartamentoFacade departamentoFacade = new DepartamentoFacade();
        EdificioFacade edificioFacade = new EdificioFacade();

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Usuario()
        {
            return View();
        }

        public ActionResult RegistrarUsuario()
        {
            return View();
        }

        public ActionResult BuscarUsuario()
        {
            return View();
        }

        public ActionResult CambiarPassword()
        {
            return View();
        }

        [HttpPost]
        public JsonResult registrarUsuario(UsuarioBean usuario, PersonalBean personal, VendedorBean vendedor, ClienteBean cliente, HabitanteBean habitante)
        {
            try
            {
                if (usuarioFacade.existeusuario(usuario.User))
                {
                    log.Warn("El usuario: \"" + usuario.User + "\"ya existe");
                    return Json(new { me = "El usuario ya existe" });
                }

                //if (usuarioFacade.existenrodoc(usuario.TipoDocumento, usuario.NroDocumentoPersona))
                //{
                //    log.Warn("El numero de documento: \"" + usuario.NroDocumentoPersona + "\"ya existe");
                //    return Json(new { me = "El número de documento ya existe" });
                //}

                if (usuario.IdCargo == 12)
                {

                    if (usuario.EsInquilino == 2)
                    {
                        if (usuarioFacade.TienePropietario(usuario.IdDepartamento))
                        {
                            log.Warn("El departamento: \"" + usuario.IdDepartamento + "\"ya tiene un propietario asignado");
                            return Json(new { me = "El departamento ya tiene un propietario asignado." });
                        }
                    }

                    if (usuario.EsInquilino == 1)
                    {
                        if (usuarioFacade.existenrodoc(usuario.TipoDocumento, usuario.NroDocumentoPersona))
                        {
                            log.Warn("El numero de documento: \"" + usuario.NroDocumentoPersona + "\"ya existe");
                            return Json(new { me = "La persona ya habita en un departamento" });
                        }
                    }
                    
                    if (usuario.NroDocumentoPersona == usuario.DniConyuge)
                    {
                    return Json(new { me = "El usuario y el conyuge tienen el  mismo número de documento. Intente de nuevo." });
                    }

                }

            
                string conexion = usuarioFacade.RegistrarUsuario(usuario, personal, vendedor, cliente, habitante);

                if (conexion == "Bien")
                {
                    return Json(new { me = "Se ingreso correctamente el usuario" });
                }
                else
                {
                    return Json(new { me = "Existe un error en registrar usuario" });
                }
            }
            catch (Exception ex){
                log.Error("Registrar Usuario - GET(EXCEPTION):", ex);
                return Json(new {me = "Ocurrió un error al registrar"});
            }

        }

        [HttpPost]
        public JsonResult cambiarPassword(UsuarioBean usuario)
        {
            try
            {
            
                if (!usuarioFacade.esSuPassword(usuario.User, usuario.Password))
                {
                    return Json(new { me = "La contraseña actual es incorrecta" });
                }

                if (usuario.PasswordNuevo1 != usuario.PasswordNuevo2)
                {
                    return Json(new { me = "La contraseña nueva no coincide con la confirmación. Intente de nuevo." });
                }

                string conexion = usuarioFacade.cambiarpassword(usuario);

                if (conexion == "Bien")
                {
                    return Json(new { me = "Se cambio correctamente la constraseña" });
                }
                else
                {
                    return Json(new { me = "Existe un error al cambiar la contraseña" });

                }
            }
            catch (Exception ex)
            {
                log.Error("Cambiar Password - GET(EXCEPTION):", ex);
                return Json(new { me = "Ocurrió un error al cambiar la contraseña" });
            }
        }

        [HttpPost]
        public JsonResult modificarUsuario(UsuarioBean usuario, PersonalBean personal, HabitanteBean habitante)
        {
            try
            {
                var nro_documento_ant = usuario.NroDocumentoPersona;
                if (!(usuario.User == null))
                {
                    if (!usuarioFacade.mismousuario(usuario.User, usuario.IdPersona))
                    {
                        if (usuarioFacade.existeusuario(usuario.User))
                        {
                            log.Warn("El usuario: \"" + usuario.User + "\"ya existe");
                            return Json(new { me = "El usuario ya existe" });
                        }
                    }
                }

                if (!usuarioFacade.mismonrodoc(usuario.TipoDocumento, usuario.NroDocumentoPersona, usuario.IdPersona))
                {
                    if (usuarioFacade.existenrodoc(usuario.TipoDocumento, usuario.NroDocumentoPersona))
                    {
                        log.Warn("El numero de documento: \"" + usuario.NroDocumentoPersona + "\"ya existe");
                        return Json(new { me = "El número de documento ya existe" });
                    }
                }
                if (usuario.IdCargo == 12)
                {

                    List<HabitanteBean> listaUsuario = usuarioFacade.ListarHabitanteMod(habitante);
                    return Json(new { listaUsuario });
                }
                else
                {
                    if (usuario.IdCargo == 5)
                    {
                        List<PersonalBean> listaUsuario = usuarioFacade.ListarPersonalMod(personal);
                        return Json(new { listaUsuario });
                    }
                    else
                    {

                        List<UsuarioBean> listaUsuario = usuarioFacade.ListarUsuarioMod(usuario, personal, habitante);
                        return Json(new { listaUsuario });
                    }
                }
            }
            catch (Exception ex)
            {
                log.Error("Modificar Usuario - GET(EXCEPTION):", ex);
                return Json(new { me = "Ocurrió un error al modificar" });
            }
        }

        [HttpPost]
        public JsonResult buscarUsuario(UsuarioBean usuario)
        {
            try
            {
                List<UsuarioBean> listaUsuario = usuarioFacade.ListarUsuario(usuario);
                return Json(new { listaUsuario });
            }
            catch (Exception ex)
            {
                log.Error("Buscar Usuario - GET(EXCEPTION):", ex);
                return Json(new { listaUsuario = "Ocurrió un error al buscar" });
            }
        }
        [HttpPost]
        public JsonResult eliminarUsuario(UsuarioBean usuario)
        {
            try {
                string conexion = usuarioFacade.eliminarUsuario(usuario);

                if (conexion == "Bien")
                {
                    return Json(new { me = "Se elimino correctamente" });
                }
                else
                {
                    return Json(new { me = "Existe un error al eliminar usuario" });
                }
            }
            catch (Exception ex)
            {
                log.Error("Eliminar Edificio - GET(EXCEPTION):", ex);
                return Json(new { me = "Ocurrió un error al eliminar" });
            }       
        }

        [HttpPost]
        public JsonResult cargarTipoDoc(TipoDocBean tipodoc)
        {
            try
            {
                List<TipoDocBean> listaTipoDoc = tipodocFacade.ListarTipoDoc(tipodoc);

                return Json(new { listaTipoDoc });
            }

            catch (Exception ex)
            {
                log.Error("CargarTipoDoc - GET(EXCEPTION):", ex);
                return Json(new { listaTipoDoc = "Ocurrió un error al cargar los tipos de documento" });
            }    
        }

        [HttpPost]
        public JsonResult cargarSeguro(SeguroBean seguro)
        {
            try
            {
                List<SeguroBean> listaSeguros = seguroFacade.ListarSeguro(seguro);

                return Json(new { listaSeguros });
            }

            catch (Exception ex)
            {
                log.Error("CargarSeguros - GET(EXCEPTION):", ex);
                return Json(new { listaSeguros = "Ocurrió un error al cargar los seguros" });
            }       
        }

        [HttpPost]
        public JsonResult cargarCargos(CargoBean cargo)
        {
            try
            {
                List<CargoBean> listaCargos = cargoFacade.ListarCargo(cargo);

                return Json(new { listaCargos });
            }

            catch (Exception ex)
            {
                log.Error("CargarCargos - GET(EXCEPTION):", ex);
                return Json(new { listaCargos = "Ocurrió un error al cargar los cargos" });
            }   
        }


        [HttpPost]
        public JsonResult cargarDepartamentos(DepartamentoPeruBean departamento)
        {
            try
            {
                List<DepartamentoPeruBean> listaDepartamentoPeru = departamentoPeruFacade.ListarDepartamentoPeru(departamento);

                return Json(new { listaDepartamentoPeru });
            }

            catch (Exception ex)
            {
                log.Error("CargarDepartamento - GET(EXCEPTION):", ex);
                return Json(new { listaDepartamentoPeru = "Ocurrió un error al cargar los Departamentos" });
            }  
        }

        [HttpPost]
        public JsonResult cargarProvincias(DepartamentoPeruBean departamento)
        {
             try
            {
                List<ProvinciaPeruBean> listaProvinciaPeru = provinciaPeruFacade.ListarProvinciaPeru(departamento);

                return Json(new { listaProvinciaPeru });
            }
             catch (Exception ex)
             {
                 log.Error("CargarProvincia - GET(EXCEPTION):", ex);
                 return Json(new { listaProvinciaPeru = "Ocurrió un error al cargar las Provincias" });
             } 
        }

        [HttpPost]
        public JsonResult cargarDistritos(ProvinciaPeruBean provincia)
        {
            try
            {

                List<DistritoPeruBean> listaDistritoPeru = distritoPeruFacade.ListarDistritoPeru(provincia);
                return Json(new { listaDistritoPeru });
            }

            catch (Exception ex)
            {
                log.Error("CargarDistrito - GET(EXCEPTION):", ex);
                return Json(new { listaDistritoPeru = "Ocurrió un error al cargar los Distritos" });
            } 
        }

        [HttpPost]
        public JsonResult cargarEdificio(EdificioBean edificio)
        {
            try
            {
                List<EdificioBean> listaEdificio = edificioFacade.Listaredificio(edificio);
                return Json(new { listaEdificio });
            }

            catch (Exception ex)
            {
                log.Error("CargarEdificio - GET(EXCEPTION):", ex);
                return Json(new { listaEdificio = "Ocurrió un error al cargar los Edificios" });
            } 
        }

        public JsonResult cargarEdificioNulo(EdificioBean edificio)
        {
            try
            {
                List<EdificioBean> listaEdificioNulo = edificioFacade.ListarEdificioNulo(edificio);
                return Json(new { listaEdificioNulo });
            }

            catch (Exception ex)
            {
                log.Error("CargarEdificio - GET(EXCEPTION):", ex);
                return Json(new { listaEdificio = "Ocurrió un error al cargar los Edificios" });
            }
        }

        public JsonResult cargarDpto(DepartamentoBean departamento)
        {
            try
            {
                List<DepartamentoBean> listaDepartamento = departamentoFacade.Listardepartamento(departamento);
                return Json(new { listaDepartamento });
            }

            catch (Exception ex)
            {
                log.Error("CargarDepartamento - GET(EXCEPTION):", ex);
                return Json(new { listaDepartamento = "Ocurrió un error al cargar los departamentos" });
            } 
        }


    }
}
